package com.atguigu.lease.web.admin.controller.system;


import com.atguigu.lease.common.result.Result;
import com.atguigu.lease.model.entity.SystemUser;
import com.atguigu.lease.model.enums.BaseStatus;
import com.atguigu.lease.web.admin.service.SystemUserService;
import com.atguigu.lease.web.admin.vo.system.user.SystemUserItemVo;
import com.atguigu.lease.web.admin.vo.system.user.SystemUserQueryVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;


@Tag(name = "后台用户信息管理")
@RestController
@RequestMapping("/admin/system/user")
public class SystemUserController {

    @Autowired
    private SystemUserService systemUserService;

    @Operation(summary = "根据条件分页查询后台用户列表")
    @GetMapping("page")
    public Result<IPage<SystemUserItemVo>> page(@RequestParam long current, @RequestParam long size, SystemUserQueryVo queryVo) {
        IPage<SystemUserItemVo> page = new Page<>(current, size);
        page= systemUserService.findSystemUserItemVoPage(page,queryVo);
        return Result.ok(page);
    }

    @Operation(summary = "根据ID查询后台用户信息")
    @GetMapping("getById")
    public Result<SystemUserItemVo> getById(@RequestParam Long id) {
        SystemUserItemVo systemUserItemVo= systemUserService.findSystemUserItemVoById(id);
        return Result.ok(systemUserItemVo);
    }

    @Operation(summary = "保存或更新后台用户信息")
    @PostMapping("saveOrUpdate")
    public Result saveOrUpdate(@RequestBody SystemUser systemUser) {
        //systemUser判断传过来的有没有密码，并判断密码是否为空和null,null不能进行加密
        //判断systemUser中的passwd为null或空字符串时不需要加密
        /*
        这里有个全局配置
          mybatis-plus:global-config:db-config:
        update-strategy: not_empty  #添加用户时的功能。密码判断为空和null的修改策略，当不为null和空字符串才去修改他。默认为not_null
        默认为not_null，但是实际情况是，当为“” 时不执行密码加密，数据库直接为空
         */
        if(StringUtils.hasText(systemUser.getPassword())){
            systemUser.setPassword(DigestUtils.md5Hex(systemUser.getPassword()));
        }
         systemUserService.saveOrUpdate(systemUser);
        return Result.ok();
    }

    @Operation(summary = "判断后台用户名是否可用")
    @GetMapping("isUserNameAvailable")  //字符串可用为true,不可用为false
    public Result<Boolean> isUserNameAvailable(@RequestParam String username) {
        /*
        判断用户名是否存在： 2种方式：1.查询数据 2.查询符合条件的数据的数量
        要用数据就查数据，不用数据就查数量。只需要知道可用还是不可用就行
         */
        LambdaQueryWrapper<SystemUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SystemUser::getUsername, username);
        long count = systemUserService.count(queryWrapper);
        return Result.ok(count==0); //数量恒等于0就是可用
    }

    @DeleteMapping("deleteById")
    @Operation(summary = "根据ID删除后台用户信息")
    public Result removeById(@RequestParam Long id) {
        /*
        当删除条件为多对一时，可以直接删除多的条件，但是，不能删除1的一方
        岗位和人时一对多，人相对于岗位为多对一，删除多的人不会影响1的岗位.但是删除1会影响多。1的不能删除
        要根据权重判断，明显岗位更重要，人次之。那么岗位就是1，人就是多。人删除不会对岗位有影响。人可以被删除
         */
        systemUserService.removeById(id);
        return Result.ok();
    }

    @Operation(summary = "根据ID修改后台用户状态")
    @PostMapping("updateStatusByUserId")
    public Result updateStatusByUserId(@RequestParam Long id, @RequestParam BaseStatus status) {
        LambdaUpdateWrapper<SystemUser> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(SystemUser::getId, id).set(SystemUser::getStatus, status);
        systemUserService.update(updateWrapper);
        return Result.ok();
    }
}
